/**
 *
 * 通常一个CPU内核处理器可以处理一个线程，但是现代cpu通过超线程技术可以同时处理两个线程；
 * 核心数即cpu个数；
 * 同一时刻，单个cpu线程数只能处理一个java线程，或者其他任意线程；
 * java所有线程都在JVM进程中；
 * cpu调度的是进程中的线程；
 * 当计算机运行的进程中所有线程数大于cpu线程数的时候，操作系统会采用时间片机制：为每个线程分配时间额度，如果当前线程的时间额度用完了，就会被强制停止（不考虑优先级等机制），切换其他线程执行；这样会给人一个计算机能够同时处理很多线程的错觉。
 * cup核心数多当然就能够同时处理多个线程；
 *
 * 抢占式多任务系统：总控制权在操作系统手中，操作系统会轮流询问每一个任务是否需要使用 CPU，需要使用的话就让它用，
 *      不过在一定时间后，操作系统会剥夺当前任务的 CPU 使用权，把它排在询问队列的最后，再去询问下一个任务……。
 *    具有最高优先级的线程就是当前正在运行的那个线程。驻留在CPU内正在运行的线程会在什么时候中止呢？一是属于它的 时间片已经到期，二是加入了另一个优先级更高的线程。
 *    在抢占式多任务系统中，操作系统必须具有从任何一个运行的程序上取走控制权和使另一个程序获得控制权的能力。
 *
 * 协作式多任务系统：个任务得到了 CPU 时间，除非它自己放弃使用CPU，否则将完全霸占CPU；
 *
 *
 * 多CPU/多核/多进程/多线程/并发/并行之间的关系？
 *
 * 当面临这些问题的时候，有两个关键词无法绕开，那就是并行和并发。
 *
 * 首先，要先了解几个概念：
 *
 * 　　1、进程是程序的一次执行。
 * 　　2、进程是资源分配的基本单位（调度单位）。
 * 　　3、一个进程可以包括多个线程。
 * 　　4、在单CPU计算机中，有一个资源是无法被多个程序并行使用的：CPU。
 * 　　5、操作系统调度器：拆分CPU为一段段时间的运行片，轮流分配给不同的程序。
 * 　　6、操作系统内存管理模块：管理物理内存、虚拟内存相关的事务。
 *
 * 　　由于CPU同时刻只能执行一个进程，如果我们不加以控制的话，一个进程可能使用CPU直到运行结束，于是出现了操作系统调度器，而进程也成为了调度单位。
 *
 * 　　进程的运行不仅仅需要CPU，还需要很多其他资源，如内存啊，显卡啊，GPS啊，磁盘啊等等，统称为程序的执行环境，也就是程序上下文。
 *
 * 　　在这里就出现了并发的概念，调度器切换CPU给不同进程使用的速度非常快，于是在使用者看来程序是在同时运行，这就是并发，而实际上CPU在同一时刻只在运行一个进程。
 *
 * 　　CPU进程无法同时刻共享，但是出现一定要共享CPU的需求呢？此时线程的概念就出现了。线程被包含在进程当中，进程的不同线程间共享CPU和程序上下文。（共享进程分配到的资源）
 *
 * 　　单CPU进行进程调度的时候，需要读取上下文+执行程序+保存上下文，即进程切换。
 *
 * 　　如果这个CPU是单核的话，那么在进程中的不同线程为了使用CPU核心，则会进行线程切换，但是由于共享了程序执行环境，这个线程切换比进程切换开销少了很多。在这里依然是并发，唯一核心同时刻只能执行一个线程。
 *
 * 　　如果这个CPU是多核的话，那么进程中的不同线程可以使用不同核心，真正的并行出现了。
 *
 * 　　线程是CPU调度和分配的基本单位，一定要和 进程是操作系统进行资源分配（包括cpu、内存、磁盘IO等）的最小单位 区别清楚。有句话说CPU只能看到线程，可以这么理解，假设我是CPU，我闭着眼，操作系统调度器将一个进程分配给我之后，我拿到进程睁开眼，我看到的是什么？我看到的是进程中的很多线程，那么我现在能调度和分配的是什么？进程？不行，因为我看不到其他进程，何来调度分配，只能调度我看到的那些线程，如果我是4核的话，把线程ABCD分配到核心1234，其他的线程依然要等待分配，至于等待多久，如何分配，暂不在本文讨论范围。于是线程是CPU调度和分配的基本单位。
 *
 * 　　最后说一下操作系统内存管理模块这里做的事：在这之前，程序员需要为每个程序安排运行的空间，这里的空间指的是内存的物理地址，但是这么的问题就是，每个程序都要协商如何使用同一内存的不同空间，而且程序员还要关心底层内存分配问题。解决办法就是，提出进程的概念，每个进程用一样的虚拟地址空间，CPU上增加了MMU模块负责转换虚拟地址和物理地址，虚拟地址经过操作系统和MMU之后，虚拟地址会映射到不同的物理地址，不同的进程就能获得各自独立的物理内存空间。
 *
 * 　　另外在有的操作系统里，进程不是调度单位，线程是最基本的调度单位，调度器只调度线程，不调度进程，如VxWorks。
 *
 *
 * 　　总结：
 * 　　1、单CPU中进程只能是并发，多CPU计算机中进程可以并行。
 * 　　2、单CPU单核中线程只能并发，单CPU多核中线程可以并行。
 * 　　3、无论是并发还是并行，使用者来看，看到的是多进程，多线程。
 *
 *  cpu单核和多核的区别bai为：du单元组数不同、zhi运行线程数不同、dao执行速度不同。
 *
 * 一、单元组数不同
 * 1、cpu单核：cpu单核只有1个独立的CPU核心单元组。
 * 2、cpu多核：cpu多核包括2个相对独立的CPU核心单元组。
 *
 * 二、运行线程数不同
 * 1、cpu单核：cpu单核能同时运行的线程数较多核更少，不利于同时运行多个程序。
 * 2、cpu多核：cpu多核能同时运行的线程数较单核更多，有利于同时运行多个程序。
 *
 * 三、执行速度不同
 * 1、cpu单核：cpu单核的执行速度较多核更慢，容易造成卡顿。
 * 2、cpu多核：cpu多核的执行速度较单核更快，不容易造成卡顿，更流畅。
 *
 * @date 2020/12/21
 */
package cn.jdemo.juc.thread;